From: Keir Fraser Date: Wed, 2 Sep 2009 10:39:02 +0000 (+0100) Subject: x86: rdtsc emulation (PV and HVM) must be monotonically increasing X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13394 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=b2af4890749e010602f1cbe3caabcfaa980cd4a8;p=xen.git x86: rdtsc emulation (PV and HVM) must be monotonically increasing The Intel SDM (section 18.10) clearly states that rdtsc returns a "monotonically increasing unique value". Current emulation code for rdtsc (both PV and HVM) returns only a monotonically-non-decreasing (non-unique) value, so ensure stale value is always incremented. Signed-off-by: Dan Magenheimer --- diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index eb24f5d398..0cb180ceba 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -47,10 +47,10 @@ u64 hvm_get_guest_time(struct vcpu *v) spin_lock(&pl->pl_time_lock); now = get_s_time() + pl->stime_offset; - if ( (int64_t)(now - pl->last_guest_time) >= 0 ) + if ( (int64_t)(now - pl->last_guest_time) > 0 ) pl->last_guest_time = now; else - now = pl->last_guest_time; + now = ++pl->last_guest_time; spin_unlock(&pl->pl_time_lock); return now + v->arch.hvm_vcpu.stime_offset; diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 5292a3b9a1..f458a29766 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -1454,10 +1454,10 @@ void pv_soft_rdtsc(struct vcpu *v, struct cpu_user_regs *regs) rdtsc_usercount++; spin_lock(&v->domain->arch.vtsc_lock); now = get_s_time() + v->domain->arch.vtsc_stime_offset; - if ( (int64_t)(now - v->domain->arch.vtsc_last) >= 0 ) + if ( (int64_t)(now - v->domain->arch.vtsc_last) > 0 ) v->domain->arch.vtsc_last = now; else - now = v->domain->arch.vtsc_last; + now = ++v->domain->arch.vtsc_last; spin_unlock(&v->domain->arch.vtsc_lock); regs->eax = (uint32_t)now; regs->edx = (uint32_t)(now >> 32);